From 54f2a51531cea1560d15ccdde39d79587a15a222 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Tue, 25 Jul 2006 19:38:56 +0100 Subject: [PATCH] [XEN] Increase debug stack size from 4kB to 8kB. Also fix double-fault handlers. Signed-off-by: Keir Fraser --- xen/arch/x86/mm.c | 7 +++++++ xen/arch/x86/traps.c | 9 ++++++--- xen/arch/x86/x86_32/mm.c | 5 ----- xen/arch/x86/x86_32/traps.c | 4 ++++ xen/arch/x86/x86_64/entry.S | 8 +++++--- xen/arch/x86/x86_64/mm.c | 6 ------ xen/arch/x86/x86_64/traps.c | 28 +++++++++++++++++++++++++--- xen/include/asm-x86/config.h | 10 ++++------ 8 files changed, 51 insertions(+), 26 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 20a7e125cd..40928a555d 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -3881,6 +3881,13 @@ void memguard_unguard_range(void *p, unsigned long l) #endif +void memguard_guard_stack(void *p) +{ + BUILD_BUG_ON((DEBUG_STACK_SIZE + PAGE_SIZE) > STACK_SIZE); + p = (void *)((unsigned long)p + STACK_SIZE - DEBUG_STACK_SIZE - PAGE_SIZE); + memguard_guard_range(p, PAGE_SIZE); +} + /* * Local variables: * mode: C diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 46012d666d..aac1d70e76 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -279,11 +279,14 @@ void show_stack(struct cpu_user_regs *regs) void show_stack_overflow(unsigned long esp) { #ifdef MEMORY_GUARD - unsigned long esp_top = get_stack_bottom() & PAGE_MASK; + unsigned long esp_top; unsigned long *stack, addr; - /* Trigger overflow trace if %esp is within 100 bytes of the guard page. */ - if ( ((esp - esp_top) > 100) && ((esp_top - esp) > 100) ) + esp_top = (esp | (STACK_SIZE - 1)) - DEBUG_STACK_SIZE; + + /* Trigger overflow trace if %esp is within 512 bytes of the guard page. */ + if ( ((unsigned long)(esp - esp_top) > 512) && + ((unsigned long)(esp_top - esp) > 512) ) return; if ( esp < esp_top ) diff --git a/xen/arch/x86/x86_32/mm.c b/xen/arch/x86/x86_32/mm.c index 20c2dded23..cc438a7017 100644 --- a/xen/arch/x86/x86_32/mm.c +++ b/xen/arch/x86/x86_32/mm.c @@ -345,11 +345,6 @@ int check_descriptor(struct desc_struct *d) return 0; } -void memguard_guard_stack(void *p) -{ - memguard_guard_range(p, PAGE_SIZE); -} - /* * Local variables: * mode: C diff --git a/xen/arch/x86/x86_32/traps.c b/xen/arch/x86/x86_32/traps.c index c47ce08708..3774aa83c8 100644 --- a/xen/arch/x86/x86_32/traps.c +++ b/xen/arch/x86/x86_32/traps.c @@ -122,6 +122,7 @@ asmlinkage void do_double_fault(void) { struct tss_struct *tss = &doublefault_tss; unsigned int cpu = ((tss->back_link>>3)-__FIRST_TSS_ENTRY)>>1; + char taint_str[TAINT_STRING_MAX_LEN]; watchdog_disable(); @@ -129,6 +130,9 @@ asmlinkage void do_double_fault(void) /* Find information saved during fault and dump it to the console. */ tss = &init_tss[cpu]; + printk("*** DOUBLE FAULT: Xen-%d.%d%s %s\n", + XEN_VERSION, XEN_SUBVERSION, XEN_EXTRAVERSION, + print_tainted(taint_str)); printk("CPU: %d\nEIP: %04x:[<%08x>]", cpu, tss->cs, tss->eip); print_symbol(" %s\n", tss->eip); diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index 853dfa5715..2318ec9bbc 100644 --- a/xen/arch/x86/x86_64/entry.S +++ b/xen/arch/x86/x86_64/entry.S @@ -471,8 +471,10 @@ ENTRY(spurious_interrupt_bug) jmp handle_exception ENTRY(double_fault) - movl $TRAP_double_fault,4(%rsp) - jmp handle_exception + SAVE_ALL + movq %rsp,%rdi + call do_double_fault + ud2 ENTRY(nmi) pushq $0 @@ -518,7 +520,7 @@ ENTRY(exception_table) .quad do_bounds .quad do_invalid_op .quad math_state_restore - .quad do_double_fault + .quad 0 # double_fault .quad do_coprocessor_segment_overrun .quad do_invalid_TSS .quad do_segment_not_present diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 92e565716f..87ff181b82 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -323,12 +323,6 @@ int check_descriptor(struct desc_struct *d) return 0; } -void memguard_guard_stack(void *p) -{ - p = (void *)((unsigned long)p + PAGE_SIZE); - memguard_guard_range(p, 2 * PAGE_SIZE); -} - /* * Local variables: * mode: C diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c index bbc4d075b9..a5b7aef858 100644 --- a/xen/arch/x86/x86_64/traps.c +++ b/xen/arch/x86/x86_64/traps.c @@ -116,16 +116,38 @@ void show_page_walk(unsigned long addr) asmlinkage void double_fault(void); asmlinkage void do_double_fault(struct cpu_user_regs *regs) { + unsigned int cpu, tr; + char taint_str[TAINT_STRING_MAX_LEN]; + + asm ( "str %0" : "=r" (tr) ); + cpu = ((tr >> 3) - __FIRST_TSS_ENTRY) >> 2; + watchdog_disable(); console_force_unlock(); /* Find information saved during fault and dump it to the console. */ - printk("************************************\n"); - show_registers(regs); + printk("*** DOUBLE FAULT: Xen-%d.%d%s %s\n", + XEN_VERSION, XEN_SUBVERSION, XEN_EXTRAVERSION, + print_tainted(taint_str)); + printk("CPU: %d\nRIP: %04x:[<%016lx>]", + cpu, regs->cs, regs->rip); + print_symbol(" %s", regs->rip); + printk("\nRFLAGS: %016lx\n", regs->rflags); + printk("rax: %016lx rbx: %016lx rcx: %016lx\n", + regs->rax, regs->rbx, regs->rcx); + printk("rdx: %016lx rsi: %016lx rdi: %016lx\n", + regs->rdx, regs->rsi, regs->rdi); + printk("rbp: %016lx rsp: %016lx r8: %016lx\n", + regs->rbp, regs->rsp, regs->r8); + printk("r9: %016lx r10: %016lx r11: %016lx\n", + regs->r9, regs->r10, regs->r11); + printk("r12: %016lx r13: %016lx r14: %016lx\n", + regs->r12, regs->r13, regs->r14); + printk("r15: %016lx\n", regs->r15); show_stack_overflow(regs->rsp); printk("************************************\n"); - printk("CPU%d DOUBLE FAULT -- system shutdown\n", smp_processor_id()); + printk("CPU%d DOUBLE FAULT -- system shutdown\n", cpu); printk("System needs manual reset.\n"); printk("************************************\n"); diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h index bf7e882afc..99c74cf5ad 100644 --- a/xen/include/asm-x86/config.h +++ b/xen/include/asm-x86/config.h @@ -67,16 +67,14 @@ #ifndef NDEBUG #define MEMORY_GUARD -#ifdef __x86_64__ -#define STACK_ORDER 2 -#endif #endif -#ifndef STACK_ORDER -#define STACK_ORDER 1 -#endif +#define STACK_ORDER 2 #define STACK_SIZE (PAGE_SIZE << STACK_ORDER) +/* Debug stack is restricted to 8kB by guard pages. */ +#define DEBUG_STACK_SIZE 8192 + #define MAX_DMADOM_PFN 0x7FFFFUL /* 31 addressable bits */ #ifndef __ASSEMBLY__ -- 2.30.2